/**
 * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
 *
 * 
 * @param str string字符串 
 * @return bool布尔型
 */
 function isNumeric( str ) {
  // write code here
  // 去除str两边的空格
  str = str.trim() // 去除两边的空格
  var len = str.length
  if(len === 0) return false // 如果长度为0 就返回false
  if(isKeXue(str) || isZhengShu(str) || isXiaoShu(str)){
    return true
  }else{
    return false
  }
}
// 判断是不是科学技术法
function isKeXue(str){
  // 判断是不是科学计数法
  var eIndex = str.indexOf('e') // e的坐标
  var EIndex = str.indexOf('E') // E的坐标
  if(eIndex !== -1 && EIndex !== -1){ // 如果有两个e那就返回false
    return false
  }
  if(eIndex === -1 && EIndex === -1){ // 没找到e和E 就返回false
    return false
  }
  var res 
  if(eIndex === -1){
    res = str.split('E') // 找到e的坐标
  }
  if(EIndex === -1){
    res = str.split('e') // 以e为中间值分数组
  }
  // 如果有多个e或者E 分出来的数组就时长度大于2
  if(res.length > 2){
     return false
  }
  // 前面必须是整数或者是小数 
  if(isZhengShu(res[0])===false && isXiaoShu(res[0]) === false ){
     return false // 既不是整数 也不是小数 就返回false
  }
  // 后面必须是整数
  if(isZhengShu(res[1]) === false){
     return false
  }
  return true
}
// 判断是不是整数
function isZhengShu(str){
  var n = str.length
  if(n === 0) { // 如果长度是0 那就返回false 至少有一位数字
    return false
  }
  // 后面的就长度肯定大于等于1了
  for(let i = 0;i < n;i++){
    // 对于第一位 只可能是正号和负号 和数字 不可能是其他符合
    if(i === 0){
      if(str[i] !== '+' && str[i] !== '-' && (str[i] < '0' || str[i] > '9')){ // 如果第一个不是正号 不是负号 也不是0-9的数字 那就返回false
        return false
      }
      if(str[i] === '+' || str[i] === '-'){
         if(n === 1){
            return false
         }
      }
    }
    if(i !== 0 && (str[i] < '0' || str[i] > '9')){ // 如果除了第一位之外 还有非法字符 那就返回false
      return false
    }
  }
  return true
}
// 判断是不是小数
function isXiaoShu(str){
  // 判断是不是小数
   var n = str.length
   if(n === 0) { // 如果长度为0 就返回false
     return false
   }
   // 长度不为0
   var index = str.indexOf('.') // 小数点的位置
   if(index === -1){ // 没有小数点
        return false
   }
   if(str[0] === '+' || str[0] === '-'){ // 如果首位是正负号
      if(n === 1) return false // 如果只有正负号就返回false
      // 判断里面有没有小数点
      var flag = false // 判断是否有有效数字
      for(let i = 1;i < n;i++){ // 否则的话从第二位开始遍历 
        if(str[i] < '0' || str[i] > '9'){ // 如果有非法字符 那就返回false
           if(str[i] !== '.'){
              return false
           }else{
              if(i !== index){
                 return false
              }
           }
        }else{
           flag = true
        }
      }
      // 走出说明里面没有非法字符
      return flag // 返回是否有数字 即是否是小数
   }
   // 如果首位不是正负号 那就是正常数字了
   // 判断是不是有数字
   var outFlag = false
   for(let i = 0;i < n;i++){
     if(str[i] < '0' || str[i] > '9'){ // 处理非法字符
        if(str[i] === '.'){
           if(index !== i){
              return false
           }
        }else{
           return false
        }
     }else{
        outFlag = true
     }
   }
   return outFlag
   // 判断有没有非法字符
}
module.exports = {
  isNumeric : isNumeric
};